#include "Grua.h"

#include <glm\gtc\matrix_transform.hpp>


Grua::Grua(unsigned int alturaGrua, unsigned int longitudBrazo) : 
	m_cantPisos(alturaGrua), m_brazo(longitudBrazo),
	m_matRotacionBrazo(1.0f)
{
}


void Grua::init(const glm::vec3 &posFuenteLuzDireccional, std::string vertShaderFileName, std::string fragShaderFileName){
	this->m_brazo.init(posFuenteLuzDireccional, vertShaderFileName, fragShaderFileName);
	this->m_bloque.init(posFuenteLuzDireccional, vertShaderFileName, fragShaderFileName);
}


void Grua::setMaterial(const glm::vec3 &coefDifusion, const glm::vec3 &coefAmbiente, const glm::vec3 &coefEspecular) {
	this->m_brazo.setMaterial(coefDifusion, coefAmbiente, coefEspecular);
	this->m_bloque.setMaterial(coefDifusion, coefAmbiente, coefEspecular);
}


void Grua::renderizar(const glm::mat4 &matVista, const glm::mat4 &matProyeccion, const glm::mat4 &matModelo) const {
	// Construye la columna principal
	for (unsigned int i = 0; i < this->m_cantPisos; ++i){
		glm::mat4 matPosModel = glm::translate(matModelo, glm::vec3(0.0f, 0.0f, 2.0f * i));
		this->m_bloque.renderizar(matVista, matProyeccion, matPosModel);
	}

	// Posiciona el brazo y lo rota de ser necesario
	glm::mat4 matBrazo = glm::translate( matModelo, glm::vec3(0.0f, 0.0f, 2.0f * this->m_cantPisos) );
	matBrazo = matBrazo * this->m_matRotacionBrazo;
	this->m_brazo.renderizar(matVista, matProyeccion, matBrazo);
}


void Grua::rotarBrazo(float angulo) {
	glm::mat4 matID = glm::mat4(1.0f);
	this->m_matRotacionBrazo = glm::rotate( matID, angulo, glm::vec3(0.0f, 0.0f, 1.0f) );
}


